import asyncio
import time
#1.什么是迭代器?什么是生成器?两者有什么区别?
#迭代器可以用来表示一个数据流(像水龙头一样可开可关), 提供了数据的惰性返回功能(只有我们主动去使用next方法调用, 才会返回值).
#生成器是一种特殊的迭代器, 在迭代器惰性返回数据的基础上, 提供了额外的功能, 实现了程序的暂停.
#同样提供了惰性返回的功能, 迭代器侧重于提供**数据**的惰性返回功能, 生成器侧重于**指令**的惰性返回功能
#2.协程的实现原理:就是生成器的实现原理, 在生成器的基础上又提供了传递值的功能.
#3.asyncio实现原理: 自动维护了一个事件队列, 然后循环访问事件来完成异步的消息维护.
#4.用协程实现一个计算平均数的函数
def coro_avg():
  total = 0
  length = 0
  while True:
    try:
      value = yield total / length
    except ZeroDivisionError:
      value = yield 0  # 处理分母为0的报错
    total += value
    length += 1


my_avg = coro_avg()
print(next(my_avg))  # 对生成器进行`send`操作一定要调用`next`方法预激, 使其停留在第一个yield位置
print(my_avg.send(2))
print(my_avg.send(3))
print(my_avg.send(4))
print(my_avg.send(6))

# 5.编写一个asyncio异步程序
import time
import asyncio

class Response:
    status_code = 10

now = lambda : time.time()

async def do_some_work(x):
    print('等待中: ', x)
    response = Response()
    await asyncio.sleep(1)
    print(f"请求编号:{x}, 响应状态码:{response.status_code}")
    return response.status_code


start = now()
loop = asyncio.get_event_loop()

task_array = []
for i in range(100):
    task_array.append(do_some_work(i))

loop.run_until_complete(asyncio.wait(task_array))
loop.close()
print('一共用时: ', now() - start)
